{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "类构建器是一种特殊的方法，用于在创建类时对其进行定制和初始化。以下常用的类构建器:\n",
    "### 1. __init__构建器：\n",
    "> __init__是最常见和常用的类构建器之一。它在创建类的实例时被调用，并用于初始化实例的属性和执行其他必要的设置操作。通常，__init__方法接受参数，并使用它们来设置实例的初始状态。\n",
    "\n",
    "* __init__方法是类的实例化过程中的构造函数。\n",
    "* 它在对象创建后立即调用，并用于执行实例的初始化操作。\n",
    "* __init__方法可以接受参数，用于传递初始值给实例的属性。\n",
    "* 一般情况下，__init__方法不返回任何值，它的主要目的是为了初始化对象。\n",
    "\n",
    "### __new__构建器：\n",
    "> __new__方法在创建类的实例之前被调用。它负责实际创建实例，并返回一个新的实例对象。通常，你只需要在特殊情况下才会重写__new__方法，例如创建一个不可变的类。\n",
    "\n",
    "* __new__方法在对象实例化之前被调用。\n",
    "* 它是一个类方法，接受类作为第一个参数，并返回一个新的实例对象。\n",
    "* __new__方法负责创建实例，并可以在创建实例时对其进行自定义设置。\n",
    "* 通常情况下，你只需要在特殊情况下才会重写__new__方法，例如创建一个不可变的类或控制实例的创建过程。\n",
    "\n",
    "### __del__构建器：\n",
    "> __del__方法在实例被销毁之前被调用。它用于执行清理和资源释放的操作。然而，应该注意避免过度依赖__del__方法，因为它的调用时机不确定。\n",
    "\n",
    "* __del__方法在对象被销毁之前被调用。\n",
    "* 它用于执行清理和资源释放的操作，如关闭文件、释放内存等。\n",
    "* 但是，应该谨慎使用__del__方法，因为它的调用时机是不确定的，受垃圾回收机制的影响。\n",
    "\n",
    "### __repr__构建器：\n",
    "> __repr__方法返回一个用于表示实例的字符串，通常是一个可以用于重新创建该实例的表达式。它常用于调试和输出对象的信息。\n",
    "\n",
    "* __repr__方法返回一个用于表示实例的字符串。\n",
    "* 这个字符串通常是一个可以用于重新创建该实例的表达式。\n",
    "* __repr__方法常用于调试和显示对象的信息，应该尽量返回一个准确、可执行的表达式。\n",
    "\n",
    "### __str__构建器：\n",
    "> __str__方法返回一个用于表示实例的可读字符串。它通常用于以友好和可读的方式显示对象的信息。\n",
    "\n",
    "* __str__方法返回一个用于表示实例的可读字符串。\n",
    "* 这个字符串通常用于以友好和可读的方式显示对象的信息。\n",
    "* __str__方法在打印对象或使用str()函数时被调用。\n",
    "\n",
    "这些类构建器是Python面向对象编程中的常用工具，它们可以用于自定义类的行为和特性。通过重写这些特殊方法，你可以实现更灵活和定制化的类，使其适应你的具体需求。它们为你提供了更多的控制权，允许你在对象的创建、初始化、销毁和表示等方面添加额外的逻辑和功能。"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "##  定义具有命名字段的数据结构\n",
    "> collections.namedtuple、typing.NamedTuple和@dataclass是Python中用于定义具有命名字段的数据结构的工具。\n",
    "\n",
    "### collections.namedtuple：\n",
    "* collections.namedtuple是一个函数，用于创建具有字段名称的轻量级不可变数据结构。\n",
    "* 它返回一个新的类，这个类可以像元组一样被实例化和访问字段。\n",
    "* 定义命名元组时，需要提供一个名称和一个字段列表作为参数。\n",
    "* 字段列表可以是字段名称的字符串列表，或者是带有字段名称和默认值的元组列表。\n",
    "\n",
    "以下是使用collections.namedtuple的示例："
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "from collections import namedtuple\n",
    "\n",
    "Point = namedtuple('Point', ['x', 'y'])\n",
    "p = Point(1, 2)\n",
    "print(p.x)  # 输出: 1\n",
    "print(p.y)  # 输出: 2"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-02-25T08:34:27.014673500Z",
     "start_time": "2024-02-25T08:34:27.004251300Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### typing.NamedTuple：\n",
    "> typing.NamedTuple是Python中的类型提示工具，用于创建具有命名字段的不可变数据结构。\n",
    "\n",
    "* 它是一个类装饰器，可以应用于自定义类，使其具有命名字段的特性。\n",
    "* 定义NamedTuple时，需要提供一个名称和一个字段列表作为参数。\n",
    "* 字段列表可以是字段名称和类型的字符串字典，或者是带有字段名称和类型的元组列表。\n",
    "\n",
    "以下是使用typing.NamedTuple的示例："
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "from typing import NamedTuple\n",
    "\n",
    "class Point(NamedTuple):\n",
    "    x: int\n",
    "    y: int\n",
    "\n",
    "p = Point(1, 2)\n",
    "print(p.x)  # 输出: 1\n",
    "print(p.y)  # 输出: 2"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-02-25T08:35:25.264478800Z",
     "start_time": "2024-02-25T08:35:25.244491Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### @dataclass：\n",
    "> @dataclass是Python 3.7及以上版本的装饰器，用于自动为类生成一些常见的方法，如__init__、__repr__等。\n",
    "\n",
    "* 它可以用于定义具有字段的可变或不可变数据类。\n",
    "* 在使用@dataclass装饰器时，需要在类定义前添加装饰器，并在类中声明字段。\n",
    "* @dataclass使用类型提示来推断字段的类型，并自动创建相应的方法。\n",
    "\n",
    "以下是使用@dataclass的示例："
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "from dataclasses import dataclass\n",
    "\n",
    "@dataclass\n",
    "class Point:\n",
    "    x: int\n",
    "    y: int\n",
    "\n",
    "p = Point(1, 2)\n",
    "print(p.x)  # 输出: 1\n",
    "print(p.y)  # 输出: 2"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-02-25T08:36:09.214164900Z",
     "start_time": "2024-02-25T08:36:09.190176500Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### collections.namedtuple、typing.NamedTuple和@dataclass的区别：\n",
    "> collections.namedtuple 和 typing.NamedTuple 构建的类都是 tuple 的子类。@dataclass 是类装饰器，不影响类层次结构。\n",
    "\n",
    "* collections.namedtuple和typing.NamedTuple是用于创建具有命名字段的不可变数据结构的工具，其中collections.namedtuple适用于较旧的Python版本，而typing.NamedTuple适用于较新的Python版本，并提供类型提示功能。\n",
    "* @dataclass是一个装饰器，用于自动为类生成一些常见的方法，并支持定义具有字段的可变或不可变数据类，它在Python 3.7及以上版本中可用，并提供更多的功能和灵活性。"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
